package com.mls.medicinereminder.utils;


import static java.lang.Math.*;

/*
* 模糊搜索工具类
* minDistance   编辑距离：字符串a--》b所需要的添加、删除、替换的最少步数
* getsimilarity   字符串相似度：相似度 =  （长串的长度 - 编辑距离）/ 长串的长度  ； // 长串的长度： Math.max(str1.length(),str2.length());
* */

public class SearchUtils {
    /*
    * 编辑距离算法
    * sourceStr 源字符串
    * targetStr 目标字符串
    * */
    public static int minDistance(String sourceStr,String targetStr){

        int lenA=sourceStr.length();
        int lenB=targetStr.length();

        if(lenA==0){
            return lenB;
        }
        if(lenB==0){
            return lenA;
        }

        int[][] arr=new int[lenA+1][lenB+1];
        arr[0][0]=0;
        for(int i=1;i<lenA+1;i++){
            arr[i][0]=i;
        }
        for(int j=1;j<lenB+1;j++){
            arr[0][j]=j;
        }

        Character charSource;
        Character charTarget;

        for(int i=1;i<lenA+1;i++){

            for(int j = 1;j < lenB+1;j++){
                charSource=sourceStr.charAt(i-1);
                charTarget=targetStr.charAt(j-1);
                if(charSource.equals(charTarget))  arr[i][j] = arr[i-1][j-1];
                else arr[i][j] = min(arr[i-1][j],min(arr[i][j-1],arr[i-1][j-1]))+1;
            }

        }
        return arr[lenA][lenB];

    }

    /**
     * 计算字符串相似度
     * similarity = (maxlen - distance) / maxlen
     * ps: 数据定义为double类型,如果为int类型 相除后结果为0(只保留整数位)
     * @param str1
     * @param str2
     * @return
     */
    public static double getsimilarity(String str1,String str2){
        double distance = minDistance(str1,str2);
        double maxlen = max(str1.length(),str2.length());
        double res = (maxlen - distance)/maxlen;

        //System.out.println("distance="+distance);
        //System.out.println("maxlen:"+maxlen);
        //System.out.println("(maxlen - distance):"+(maxlen - distance));
        return res;
    }

//    public int min(int a,int b){
//        return a>b?b:a;
//    }

}
